package com.huangpf.controlleradvice;

import com.huangpf.annotation.Car;
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.ModelAndView;

/**
 * 对控制器（Controller）的全局配置类
 * 控制器增强，即全局控制器的环绕增强类：
 * @ExceptionHandler 全局处理控制器的异常，捕获所有Controller抛出的异常
 * @ModelAttribute 全局设置隐形模型，所有Controller返回的模型中都包含此处设置的Model，此注解也可在Controller类中，控制当前类的隐形模型
 * @InitBinder 全局设定Controller参数绑定或格式化规则，此注解也可以用到Controller类中，控制此控制类的参数绑定或格式化规则
 */
@ControllerAdvice // 设置控制器的全局配置注解
public class ControllerAdviceDemo {

    /**
     * 全局处理控制器里的异常
     *
     * @param exception
     * @param request
     * @return
     */
    @ExceptionHandler(value = Exception.class) // 用户全局处理控制异常注解
    public ModelAndView exception(Exception exception, WebRequest request) {
        ModelAndView modelAndView = new ModelAndView("error");// error页面
        modelAndView.addObject("errorMessage", exception.getMessage());
        return modelAndView;
    }

    /**
     * 设置全局键值对，所有RequestMapping都能获取到次处设置的键值对
     *
     * @param model
     */
    @ModelAttribute // 全局设置键值对注解
    public void addAttributes(Model model) {
        model.addAttribute("msg", "额外信息"); // 添加额外键值对
    }

    /**
     * 设置webDataBinder绑定request中的参数
     *
     * @param webDataBinder
     */
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder) {
        webDataBinder.setDisallowedFields("id"); // 忽略ID字段
        webDataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(false));
    }
}
